// 抽离的路由处理函数，以保证模块的纯粹性
/**
 * @description 用户登录注册验证码逻辑处理
 * 后续可以使用Sequelize ORM来查询数据库
 *
 */
// 导入数据库
const db = require("../db/index");

// bcryptjs 加密后无法逆向破解，同一密码多次加密后得到的加密结果各不相同
const bcrypt = require("bcryptjs");

// 导入生成jwt的token包
const jwt = require("jsonwebtoken");
// 导入全局配置秘钥
const config = require("../config");

const svgCaptcha = require("svg-captcha");

// 注册用户的处理函数
exports.reguser = (req, res) => {
  const user = req.body;
  console.log(user, "user up");
  //定义SQL语句判断用户名是否占用
  const searchUserSQL = "select * from user where userName=?";
  db.query(searchUserSQL, user.userName, (err, result) => {
    console.log(err, "err");
    if (err) {
      return res.resp(err.message || "查询用户失败！");
    }
    if (result.length > 0) {
      return res.resp("用户已存在，请更换用户名！");
    }

    // 调用bcryptjs对密码进行加密, hashSync 第二个参数是随机长度参数
    user.password = bcrypt.hashSync(user.password, 10);
    console.log(user, "user");
    // 把数据插入数据库
    const insertUserToSQL = "insert into user set ?";
    const userInfo = { userName: user.userName, password: user.password };
    db.query(insertUserToSQL, userInfo, (insertErr, insertResult) => {
      if (insertErr) {
        return res.resp(insertErr.message || "用户插入数据库失败！");
      }
      if (insertResult.affectedRows != 1) {
        return res.resp("注册用户失败，请稍后再试");
      }
      res.resp("注册成功！", 200);
      console.log(insertResult, "insertResult");
    });
  });
};

// 生成svg验证码
exports.captcha = (req, res) => {
  const captcha = svgCaptcha.create({
    size: 4, //验证码长度
    fontSize: 45, //验证码字号
    noise: 1, //干扰线条数目
    width: 120, //宽度
    height: 32, //高度
    color: true, //验证码字符是否有颜色，默认是没有，但是如果设置了背景颜色，那么默认就是有字符颜色
    background: "#ccc", //背景色
  });

  // 验证码存储到session
  req.session.captcha = captcha.text.toLocaleLowerCase();
  // // 设置验证码过期时间 --- 不需要再设置，cookie上有设置maxAge会起作用
  // req.session.captchaExpires = Date.now() + 1000 * 60 * 2;
  res.type = "image/svg+xml";
  // res.type("svg");
  // res.status(200).send(captcha.data);
  res.resp("success", 200, captcha.data);
  console.log("req.session.captcha", req.session);
};

exports.login = (req, res) => {
  // 验证码校验 ---2分钟
  const { userName, password, captcha } = req.body;
  const sessionCaptcha = req.session.captcha;
  console.log(sessionCaptcha);
  if (sessionCaptcha) {
    if (sessionCaptcha === captcha.toLocaleLowerCase()) {
      const searchUserSQL = "select * from user where userName=?";
      db.query(searchUserSQL, userName, (err, result) => {
        if (err) {
          return res.resp(err.message || "查询用户失败！");
        }
        // 执行成功但result长度不等于1
        if (result.length !== 1) {
          return res.resp("登录失败！");
        }

        // 比较密码是否相同 compareSync(用户提交的密码，数据库加密的密码)
        const comparePassWord = bcrypt.compareSync(
          password,
          result[0].password
        );
        if (!comparePassWord) return res.resp("密码错误！");

        // 比对密码成功后，生成jwt的token
        const userToken = {
          userName: result[0].userName,
          userId: result[0].userId,
          password: "",
        };
        // 对用户信息进行加密生成token字符串
        const token = jwt.sign(userToken, config.jwtSecretKey, {
          expiresIn: config.expiresIn,
        });
        // console.log(token, "token");
        res.send({
          code: 200,
          message: "success",
          data: {
            token: "Bearer " + token,
            userId,
          },
        });
      });
    } else {
      res.resp("验证码不正确！");
    }
  } else {
    res.resp("验证码已过期！");
  }
};
